In diesem Kapitel schauen wir uns das HyperText Transfer Protocol (HTTP) an. Jedes Übertragungsprotokoll kann man in das sehr allgemein gültige OSI-Schichtenmodell einordnen. OSI bedeutet dabei Open System Interconnection, also ein offenes System für Kommunikationsverbindungen. Das Schichtenmodell beschreibt schematisch, wie die Kommunikation zwischen Computersystemen funktioniert. Jede Schicht definiert dabei bestimmte Protokolle beziehungsweise Funktionen, die für eine bestimmte Aufgabe notwendig sind. Bei einer einfachen Kommunikation zwischen exakt zwei Systemen wird das Schichtenmodell zwei Mal durchlaufen: das erste Mal von oben nach unten beim Sender, das zweite Mal von unten nach oben beim Empfänger. Da es sich bei dem Schichtenmodell um ein Referenzmodell handelt, kann jede Schicht angepasst oder ausgetauscht werden. Links sehen Sie die sieben Schichten des OSI-Modells. Über dem Übertragungskanal befindet sich die Bitübertragungsschicht: Diese Schicht kümmert sich um die physikalische Übertragung von Daten über ein Medium. Die Sicherungsschicht sorgt für die fehlerfreie Übertragung von Datenrahmen zwischen zwei Knoten in einem Netzwerk. Die Vermittlungsschicht ist für die logische Adressierung und die Bestimmung des besten Pfads für die Datenübertragung verantwortlich. Die Transportschicht stellt eine zuverlässige Datenübertragung zwischen Endpunkten sicher. Die Sitzungsschicht verwaltet die Sitzungen zwischen Anwendungen. Ein Beispielprotokoll ist Socks. Die Darstellungsschicht ist für die Datenübersetzung und Verschlüsselung verantwortlich. Die Anwendungsschicht stellt Netzwerkdienste für Anwendungen bereit. Die Netzzugangsschicht kombiniert die OSI-Schichten eins und zwei und kümmert sich um den Zugriff auf das physikalische Netzwerkmedium. Beispiele sind Ethernet, Token Bus und Token Ring. Die Internetschicht entspricht der OSI-Vermittlungsschicht und ist für die logische Adressierung und das Routing verantwortlich. Typische Protokolle sind IP und ICMP. Die Transportschicht entspricht der OSI-Transportschicht und stellt die zuverlässige Datenübertragung sicher. Bekannte Protokolle dieser Schicht sind TCP und UDP. Die Anwendungsschicht umfasst die oberen drei Schichten des OSI-Modells und stellt verschiedene Netzwerkdienste zur Verfügung. Beispiele für bekannte Protokolle dieser Schicht sind HTTP, FTP, SMTP, POP und Telnet. Was ist HTTP? Das Hypertext Transfer Protocol ist ein Protokoll auf Anwendungsebene zur Übertragung von Daten über ein Netzwerk. Es wird hauptsächlich eingesetzt, um Webseiten aus dem World Wide Web in einen Webbrowser zu laden. HTTP ist ein einfaches Klartext-Protokoll, bei dem standardmäßig keine Verschlüsselung des Übertragungsinhalts stattfindet. Es übermittelt textbasiert in ASCII-Zeichen und ist zeilenorientiert. Durch Erweiterung seiner Anfragemethoden, Header-Informationen und Statuscodes ist HTTP nicht auf Hypertext beschränkt, sondern wird zunehmend zum Austausch beliebiger Daten verwendet. HTTP ist ein zustandsloses Protokoll. Das bedeutet, dass jede Anfrage an den Server unabhängig von vorherigen Anfragen ist. Möchte man über mehrere Seiten hinweg einen angemeldeten Benutzer wiedererkennen, muss die Anwendung eine Sitzung implementieren. Dies geschieht über Session-IDs, die als Cookies gespeichert werden. Ohne zusätzliche Maßnahmen kann HTTP also keine Logins oder gar Warenkörbe in Onlineshops verwalten, da es den jeweiligen Client immer vergessen würde. Jede Nachricht besteht bei HTTP aus zwei Teilen, dem Nachrichtenkopf (Header) und dem Nachrichtenkörper (Body). Der Nachrichtenkopf enthält Informationen über den Nachrichtenkörper wie verwendete Kodierungen oder den Inhaltstyp, damit dieser vom Empfänger korrekt interpretiert werden kann. Der Nachrichtenkörper enthält die Nutzdaten. Wenn auf einer Webseite der Link zur URL „[http://www.example.net/infotext.html“](http://www.example.net/infotext.html“) aktiviert wird, so wird an den Computer mit dem Hostnamen [www.example.net](http://www.example.net) die Anfrage gerichtet, die Ressource infotext.html zurückzusenden. Zur Kommunikation ist HTTP auf ein zuverlässiges Transportprotokoll angewiesen, wofür in nahezu allen Fällen TCP verwendet wird. Die Kommunikationseinheiten in HTTP zwischen Client und Server werden als Nachrichten bezeichnet, von denen es zwei unterschiedliche Arten gibt: die Anfrage (englisch Request) vom Client an den Server und die Antwort (englisch Response) als Reaktion darauf vom Server zum Client. Der offizielle TCP-Port für HTTP ist 80, weitere typische Ports für Test-Server sind 8080 und 8000. Ein solcher Port ist der Teil einer Netzwerk-Adresse, der die Zuordnung von Verbindungen und Datenpaketen zu Server- und Client-Programmen durch Betriebssysteme bewirkt. Zu jeder Verbindung dieser beiden Protokolle gehören zwei Ports, je einer auf Seiten des Clients und des Servers. Gültige Portnummern sind 1 bis 65535. Primär sind Ports ein Merkmal zur Unterscheidung mehrerer Verbindungen zwischen demselben Paar von Kommunikations-Endpunkten. Ein solcher Endpunkt besteht aus einer IP-Adresse und einem Port und wird als Socket bezeichnet. Wie werden Ports verwendet? Startende Server fordern beim Betriebssystem bestimmte Ports an, um Verbindungen annehmen zu können. Dies sind in aller Regel well-known Ports, da hier die Portnummer nicht veröffentlicht werden beziehungsweise bekannt sein muss. Die Nummern sind vielmehr den betreffenden Programmen fest zugeordnet. Clients fordern bei ihrem Betriebssystem in der Regel einen zufälligen Port an (meist größer als 30000), um Verbindungen aufbauen zu können. Der Verbindungsaufbau erfolgt stets durch den Client, der dazu den Port des Servers kennen muss. Durch den Verbindungsaufbau erfährt der Server den Port des Clients, sodass er diesem konkreten Anwendungsprozess des Clients direkt antworten kann. Ein Beispiel für die Notwendigkeit von Ports bei HTTP: Ein Webbrowser kann während eines Downloads einen weiteren Download vom selben Server starten. Das funktioniert, weil der Browser auf dem Client dann einen weiteren Port öffnet und eine zusätzliche Verbindung zum selben Port 80 des Servers aufbaut. Der Server antwortet den unterschiedlichen Ports des Browsers mit unterschiedlichen, jeweils zusammengehörigen Inhalten. Für eine Unterscheidung der Verbindungen genügen also verschiedene Portnummern an nur einem der beiden Endpunkte. Der Prozess des Port-Demultiplexings in Netzwerken läuft folgendermaßen ab: Ankommende Pakete treffen auf der Transportschicht ein. Die Transportschicht umfasst die Protokolle UDP (User Datagram Protocol) und TCP (Transmission Control Protocol). Hier erfolgt die Demultiplexierung der Pakete, was bedeutet, dass die Pakete basierend auf ihrer Zielportnummer zugeordnet werden. Die Pakete werden zu den entsprechenden Ports weitergeleitet. Jeder dieser Ports hat eine Warteschlange, in der die Pakete in der Reihenfolge ihres Eintreffens zwischengespeichert werden. Jeder Port besitzt einen FIFO-Buffer (First In, First Out). Ist dieser Puffer voll, wird das ankommende Paket verworfen, das heißt, das Paket wird nicht verarbeitet und geht verloren. Die Pakete, die erfolgreich demultiplexiert und in den Warteschlangen gespeichert wurden, werden schließlich an die jeweiligen Anwendungsprozesse weitergeleitet. Diese Schicht ist für die eigentliche Verarbeitung der Daten verantwortlich, die durch die Netzwerkschichten übertragen wurden. Der Prozess des Ladens einer HTML-Seite durch die Interaktion zwischen einem Browser und einem Webserver umfasst mehrere Schritte, um die vollständige HTML-Seite inklusive aller eingebetteten Ressourcen zu laden. Der Browser sendet eine Anfrage an den Webserver, um die HTML-Seite zu erhalten. Diese Anfrage wird typischerweise über das HTTP-Protokoll durchgeführt. Der Webserver empfängt die Anfrage und sendet die angeforderte HTML-Seite zurück an den Browser. Dies ist der Hauptinhalt der Seite, der nun im Browser geladen wird. Nachdem die HTML-Seite vom Browser empfangen wurde, beginnt dieser mit der Analyse der Seite. Dabei werden alle Ressourcen, die in der HTML-Seite eingebettet sind (wie Bilder, CSS- und JavaScript-Dateien), identifiziert. Der Browser erkennt, dass die HTML-Seite ein Bild namens „img1.gif“ enthält und sendet eine GET-Anfrage an den Webserver, um dieses Bild zu laden. Ähnlich wie bei „img1.gif“ erkennt der Browser auch ein zweites Bild „img2.gif“ und sendet eine weitere GET-Anfrage an den Webserver, um dieses Bild zu laden. Der Webserver empfängt die GET-Anfragen und sendet die entsprechenden Bilddateien zurück an den Browser des Clients. Der Browser interpretiert dann den HTML-Code und die Bilder und rendert die Webseite.